package morpion;

import neurones.Reseau;

public class Computer extends Player {
	public Computer(int color, Reseau r){
		super(color, r);		
	}
	
	
	public int evaluation(Morpion m){
		double[] input = new double[11];
		double[] output;
		int result = -1;
		double max_scr = 0;
		
		if (r != null)
		{
			for (int i = 0; i < input.length; i++) {
				input[i]=0;
			}
			
			for(int i = 0; i < Morpion.COL; i++)
			{
				for(int j = 0; j < Morpion.ROW; j++)
				{
					input[i*3 + j] = m.get(i, j);
				}
			}
	

			
			for(int i = 0,ligne=0; i < Morpion.COL; i++,ligne=0)
			{
				for(int j = 0; j < Morpion.ROW; j++)
				{
					ligne += m.getVal(i, j);
				}
	//			if(ligne%4 == 0) {
	//				input[0]++;
	//			}
				if(ligne == 8) {
					input[9]++;
				}
	//			if(ligne <= 3) {
	//				input[2]++;
	//			}
				if(ligne == 2) {
					input[10]++;
				}
			}
	
			for(int i = 0, ligne=0; i < Morpion.ROW; i++,ligne=0)
			{
				for(int j = 0; j < Morpion.COL; j++)
				{
					ligne += m.getVal(j, i);
				}
	//			if(ligne%4 == 0) {
	//				input[0]++;
	//			}
				if(ligne == 8) {
					input[9]++;
				}
	//			if(ligne <= 3) {
	//				input[2]++;
	//			}
				if(ligne == 2) {
					input[10]++;
				}
			}
			{
				int ligne=0;
				for(int i = 0; i < Morpion.ROW; i++) {
					ligne += m.getVal(i, i);
				}
	//			if(ligne%4 == 0) {
	//				input[0]++;
	//			}
				if(ligne == 8) {
					input[9]++;
				}
	//			if(ligne <= 3) {
	//				input[2]++;
	//			}
				if(ligne == 2) {
					input[10]++;
				}
			}
			{
				int ligne=0;
				for(int i = 0; i < Morpion.ROW; i++) {
					ligne += m.getVal(i, Morpion.ROW-i-1);
				}
	//			if(ligne%4 == 0) {
	//				input[0]++;
	//			}
				if(ligne == 8) {
					input[9]++;
				}
	//			if(ligne <= 3) {
	//				input[2]++;
	//			}
				if(ligne == 2) {
					input[10]++;
				}
			}
			
			r.setInput(input);
			output = r.getOutput();
			
			for(int i = 0; i < Morpion.COL; i++)
			{
				for(int j = 0; j <Morpion.ROW; j++)
				{
					 if (result == -1 && m.get(i, j) == Morpion.EMPTY)
					 {
						 result = i*3 + j;
						 max_scr = output[i*3 + j];
					 }
					 else
					 {
						 if (output[i*3 + j] > max_scr && m.get(i, j) == Morpion.EMPTY)
						 {
							 result = i*3 + j;
							 max_scr = output[i*3 + j];
						 }
					 }
				}
			}
			
			if (nb_partie < 500000 
					|| (nb_partie < 1000000 && Math.random() < 0.75)
					|| (nb_partie < 1500000 && Math.random() < 0.50)
					|| (nb_partie < 2000000 && Math.random() < 0.25)
					|| (Math.random() < 0.1)/*Math.random() < Math.max(Math.exp(-nb_partie/1000000.), 0.10)*/)
		    //if (Math.random()*100 <(100 - ((nb_partie*100.)/2500000.)))
			{
				int x;
				int y;
				do{
					x = (int)Math.round(Math.random()*2);
					y = (int)Math.round(Math.random()*2);				
				}while (m.get(x, y) != Morpion.EMPTY);
				
				result = x*3 + y;
			}
			
			return result;
		}
		
		else return meilleurPos(m);
	}
	
	public int play(Morpion m){
		int coup=evaluation(m);
		int y=coup%3;
		int x=(coup-y)/3;
		m.set(x, y, color);
		return coup;
	}

}
